package main

import (
	"fmt"
	"sync"
	"time"
)

// Counter 包含一个需要被保护的计数器和一个互斥锁
type Counter struct {
	mu    sync.Mutex
	value int
}

// Increment 增加计数器的值，使用互斥锁保证并发安全
func (c *Counter) Increment() {
	c.mu.Lock()         // 获取锁
	defer c.mu.Unlock() // 确保函数退出时释放锁
	c.value++
}

// Value 返回当前计数器的值，使用互斥锁保证读取安全
func (c *Counter) Value() int {
	c.mu.Lock()         // 获取锁
	defer c.mu.Unlock() // 确保函数退出时释放锁
	return c.value
}

func main() {
	var counter Counter
	var wg sync.WaitGroup

	// 启动10个goroutine，每个都对计数器进行1000次递增
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for j := 0; j < 1000; j++ {
				counter.Increment()
				// 模拟一些工作
				time.Sleep(time.Nanosecond)
			}
		}()
	}

	// 等待所有goroutine完成
	wg.Wait()

	// 输出最终结果
	fmt.Printf("最终计数: %d\n", counter.Value())
}
